#include <stdio.h>
#include <string.h>
#include "sqlite3.h"

#include "drv_db_column.h"

/***************************************************************
* Name:   db_is_valid_identifier()
* Input : name 标识
* Output: void 
* Return: 合格 true
* Author: heweilong
* Revise: V1.1
* Description: 验证标识符合法性（防止SQL注入）
***************************************************************/
bool db_is_valid_identifier(const char* name)
{
	/*参数无效*/
	if (!name || *name == '\0')
	{
		return false;
	}

	/*开头不能是 数字 或者 _*/
	if (!(isalpha(*name) || *name == '_'))
	{
		return false;
	}
	
	/*只含有 数字 字母 和 _*/
	for (size_t i = 1; i < strlen(name); i++)
	{
		if (!(isalnum(name[i]) || name[i] == '_'))
		{
			return false;
		}
	}

	return true;
}

/***************************************************************
* Name:   db_get_operator_str()
* Input : op 比较运算符
* Output: void 
* Return: 对应的SQL运算符字符串
* Author: heweilong
* Revise: V1.0
* Description:安全获取比较运算符字符串
***************************************************************/
const char* db_get_operator_str(compa_operator_t op)
{
	switch(op)
	{
		case CMP_EQ:
			return "=";
		case CMP_NEQ:
			return "!=";
		case CMP_GT:
			return ">";
		case CMP_LT:
			return "<";
		case CMP_GTE:
			return ">=";
		case CMP_LTE:
			return "<=";
		default:
			return NULL;
	}
}


/***************************************************************
* Name:   db_transaction_wrapper()
* Input : db 数据库 operation 事务封装函数 table_name 操作的表 user_data用户数据
* Output: void 
* Return: SQLITE_OK 合格
* Author: heweilong
* Revise: V1.1
* Description: 执行事务
***************************************************************/
int db_transaction_wrapper(sqlite3* db, db_opt operation, const char* table_name, const void* user_data)
{
	/*输入数据 有效性判断 放在业务主函数中 */
	
	/*事务为原子性*/
	const char* begin = "BEGIN IMMEDIATE TRANSACTION;";
	const char* commit = "COMMIT TRANSACTION;";
	const char* rollback = "ROLLBACK TRANSACTION;";

	int rc = SQLITE_OK;

	/*开启事务*/
	rc = sqlite3_exec(db, begin, NULL, NULL, NULL);
	if (rc != SQLITE_OK)
	{
		DB_ERROR(db);
		return rc;
	}

	/*执行用户操作*/
	rc = operation(db, table_name, user_data);
	if (rc != SQLITE_OK)
	{
		/*操作异常 进行回滚*/
		sqlite3_exec(db, rollback, NULL, NULL, NULL);
		return rc;
	}

	/*提交事务*/
	rc = sqlite3_exec(db, commit, NULL, NULL, NULL);
	if (rc != SQLITE_OK)
	{
		/*操作异常 进行回滚*/
		DB_ERROR(db);
		sqlite3_exec(db, rollback, NULL, NULL, NULL);
	}

	return rc;
}
